/**
 * 645\. 错误的集合
 *
 * 集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，导致集合 丢失了一个数字 并且 有一个数字重复 。
 *
 * 给定一个数组 num 代表了集合 S 发生错误后的结果。
 *
 * 请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。
 *
 * @example 输入：num = [1,2,2,4]
 * 输出：[2,3]
 *
 * @see https://leetcode.cn/problems/set-mismatch/
 *
 * 思想  哈希表
 * 重复的数字在数组中出现 2 次，丢失的数字在数组中出现 0 次
 * 其余的每个数字在数组中出现 1 次。因此可以使用哈希表记录每个元素在数组中出现的次数
 * 然后遍历从 1 到 n 的每个数字，分别找到出现 2 次和出现 0 次的数字
 * 即为重复的数字和丢失的数字。
 *
 * @param {number[]} num
 */
function findErrorNum(num: number[]) {
  const result: [number, number] = [-1, -1]
  const map: Record<string, number> = Object.create(null)
  const length = num.length

  for (let i = 0; i < length; i++) {
    map[num[i]] = (map[num[i]] || 0) + 1
  }

  for (let i = 1; i <= length; i++) {
    const count = map[i] || 0

    if (count === 2) {
      result[0] = i
    }

    if (count === 0) {
      result[1] = i
    }
  }

  return result
}

console.log(findErrorNum([1, 1]))
